package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.UserHolder;
import com.itheima.reggie.domain.Cart;
import com.itheima.reggie.mapper.CartMapper;
import com.itheima.reggie.service.CartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;


// 购物车
@Slf4j
@Service
@Transactional
public class CartServiceImpl implements CartService {

    @Autowired
    private CartMapper cartMapper;

    // 添加购物车
    @Override
    public Cart add(Cart cartParam) {
        // 1. 查询是否有此购物项记录 select * from shopping_cart where user_id= ?  and (dish_id=?  | setmeal_id =?)
        LambdaQueryWrapper<Cart> qw = new LambdaQueryWrapper<>();

        // 1-1 用户id
        Long userId = UserHolder.get().getId();
        qw.eq(Cart::getUserId, userId);

        // 1-2 菜品id
        qw.eq(cartParam.getDishId() != null, Cart::getDishId, cartParam.getDishId());

        // 1-3 套餐id
        qw.eq(cartParam.getSetmealId() != null, Cart::getSetmealId, cartParam.getSetmealId());

        // 1-4 执行查询
        Cart cart = cartMapper.selectOne(qw);

        // 判断
        if (cart != null) {  // 不为空说明在订单表里已经有该菜品或套餐，只需要数量加1

            // 2.数量+1 ，更新数据库
            cart.setNumber(cart.getNumber() + 1);
            cartMapper.updateById(cart);

        } else {             // 说明在订单表里没有该菜品或套餐，需要添加改购物项（菜品或套餐）的数据

            // 3.补全信息，添加数据库
            cart = cartParam;
            cart.setUserId(userId); // 用户id
            cart.setNumber(1); // 购买数量
            cart.setCreateTime(new Date()); // 添加时间
            cartMapper.insert(cart);
        }

        // 4.返回购物车
        return cart;
    }

    // 查看购物车列表
    @Override
    public List<Cart> listCart() {
        // 1.构建条件  select * from shopping_cart where user_id = ?
        LambdaQueryWrapper<Cart> qw = new LambdaQueryWrapper<>();
        qw.eq(Cart::getUserId, UserHolder.get().getId());

        // 2.执行查询
        return cartMapper.selectList(qw);
    }

    //清空购物车
    @Override
    public void cleanCart() {
        // 1.构建条件 delete from shopping_cart where user_id = ?
        LambdaQueryWrapper<Cart> qw = new LambdaQueryWrapper<>();
        qw.eq(Cart::getUserId, UserHolder.get().getId());

        // 2.执行删除
        cartMapper.delete(qw);
    }

    // 修改购物车
    @Override
    public Cart subCart(Cart cartParam) {

        // 1.先查询购物车 ，构建SQL语句
        LambdaQueryWrapper<Cart> cqw = new LambdaQueryWrapper<>();

        // 通过ID进行关联，然后修改Cart购物车的数量
        // 先通过拦截器拦截到的UserHolder信息中获取当前用户id
        cqw.eq(Cart::getUserId, UserHolder.get().getId());

        // 情况一：修改套餐数量   通过ID进行关联两表  动态sql ,先判断非空
        cqw.eq(cartParam.getSetmealId() != null, Cart::getSetmealId, cartParam.getSetmealId());

        // 情况一：修改菜品数量   通过ID进行关联两表 动态sql
        cqw.eq(cartParam.getDishId() != null, Cart::getDishId, cartParam.getDishId());

        // 存入的用户ID，菜品ID,套餐ID作为条件进行查询
        Cart cart = cartMapper.selectOne(cqw);

        // 2.购物数量-1  这里的减一是因为有数据最少情况也是数量为1，增加和减少都是一的操作
        cart.setNumber(cart.getNumber() - 1);

        // 3.判断数量是否为0
        if (cart.getNumber() == 0) {   // 减一后为0，说明没有份数，所以删除

            // 删除购物车
            cartMapper.delete(cqw);

        } else {                       // 不为0，就更新数据

            // 更新购物车
            cartMapper.updateById(cart);

        }

        // 返回购物车数据
        return cart;
    }


}

